package com.example.servlet.controller;

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.MultiValueMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

@Controller
public class IndexController {

    // @PathVariable 注解用于从请求路径中获取参数。
    @GetMapping("/owners/{ownerId}/pets/{petId}")
    public String findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
        return "pet";
    }

    // @RequestParam 注解用于从请求参数中获取参数。
    @GetMapping("/owners/{ownerId}/pets/{petId}/visits")
    public String findVisits(@PathVariable Long ownerId, @PathVariable Long petId,
                             @RequestParam(required = false, defaultValue = "0") int page,
                             @RequestParam(required = false, defaultValue = "10") int size) {
        // ...
        return "visits";
    }

    // @ModelAttribute方法参数注解将请求参数、URI路径变量和请求头绑定到模型对象上。
    @GetMapping("/owners/{ownerId}/pets/{petId}/visits")
    public String findVisits(@PathVariable Long ownerId, @PathVariable Long petId,
                             @RequestParam(required = false, defaultValue = "0") int page,
                             @RequestParam(required = false, defaultValue = "10") int size,
                             @ModelAttribute("visits") MultiValueMap<String, String> visits) {
        // ...
        return "visits";
    }

    // 在这个例子中，User 对象的属性会从HTTP POST请求的参数中自动绑定，并且结果会存储在名为 "user" 的模型属性中。如果存在验证错误，它们会被添加到BindingResult中。
    @PostMapping("/register")
    public String registerUser(@ModelAttribute("user") User user, BindingResult result) {
        if (result.hasErrors()) {
            return "registrationForm";
        }
        // userService.registerNewUserAccount(user);
        return "redirect:/registrationSuccess";
    }


    // 添加方法返回值到模型，这里的方法返回了一个新的User实例，它将会被添加到模型中，名称默认为返回类型的简单类名（即"user"），可以在视图层使用。
    @GetMapping("/something")
    @ModelAttribute
    public User createUserModel() {
        return new User();
    }


    // ResponseEntity类似于@ResponseBody，但包含状态和头信息。
    @GetMapping("/something")
    public ResponseEntity<String> handle() {
        String body = ... ;
        String etag = ... ;
        return ResponseEntity.ok().eTag(etag).body(body);
    }

    @GetMapping("/")
    public String index() {
        return "index";
    }

    @GetMapping("/login")
    String login() {
        return "login";
    }

    @GetMapping("/register")
    String register() {
        return "register";
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    @GetMapping("/user")
    public String helloUser(String name) {
        return "Hello User!";
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/admin")
    public String helloAdmin() {
        return "Hello Admin!";
    }





}

// Spring MVC 相关的注解参考官网 https://docs.springjava.cn/spring-framework/reference/web/webmvc/mvc-controller/ann-requestmapping.html
// 还有其下一章节 https://docs.springjava.cn/spring-framework/reference/web/webmvc/mvc-controller/ann-methods.html